#ifndef _Lienzo_h
#define _Lienzo_h

#include <iostream>
using namespace std;
#include <vector>
#include "IDibujable.h"
#include "UtilidadesSVG.h"
#include "ExcepcionSVG.h"
#include "GrupoFiguras.h"

/** \file Lienzo.h
 * \brief Clase Lienzo
 *
 *	Definición de la clase Lienzo.
 *	JAVIER ANTON DIAZ DNI:48629698Q
 *	STANISLAV LITVINENKO DNI:02062226T
 */

/** \brief La clase Lienzo define el objeto tipo Lienzo.
 *
 * Los objetos pertenecientes a esta clase estarán formados por dos vectores de figuras, uno para circulos y otro para rectángulos.
 * Por otro lado consta de un título y dos floats que definen su magnitud.
 */

class Lienzo {

	
		/** \brief Función amiga, sobrecarga del operador >>.
		 *
		 *	Esta función se encarga de leer el contenido de un fichero is, y extraer la información pertinente de el.
		 *	Efectúa recortes con strings, de lo que va leyendo, y almacena los datos relevantes. Luego controla si el programa tiene que crear objetos tipo Circulo o tipo Rectangulo
		 *	o si tiene que efectuar una acción, en este caso mover.
		 * \param is Tipo istream &.
		 * \param plienzo Tipo Lienzo&.
		 * \return Devuelve istream&.
		 */
		friend istream& operator>>(istream&, Lienzo&);

		/** \brief Función amiga sobrecarga del operador <<.
		 *
		 * Este método nos devuelve un ostream con la información de salida de nuestro programa, según el formato establecido svg.
		 * \param os tipo ostream&.
		 * \param plienzo Objeto tipo const Lienzo&.
		 * \return Devuelve ostream&.
		 */
		friend ostream& operator<<(ostream&, const Lienzo&);

	public:


		/** \brief Constructor Lienzo( string ptitulo, float pancho, float palto ).
		 *
		 * Constructor de Lienzo con argumentos incializados por defecto. En caso de que le pasemos menos argumentos de los que contiene valdrán lo que definimos en la definición de la clase.
		 * \param ptitulo Tipo string, contiene el string con el que daremos nombre al Lienzo.
		 * \param pancho Tipo float, define mediante un numero real el ancho del lienzo.
		 * \param palto Tipo float, define con un numero real, el alto del lienzo, como pancho.
		 * \return No devuelve nada el método.
		 */
		Lienzo( string ptitulo = "" , float pancho = 1000.0, float palto = 1000.0 );

		/** \brief Destructor de Lienzo ~Lienzo().
		 *
		 * El destructor en primer luegar define punteros a vectores de contenido Circulo y Rectangulo para prodecer a su borrado.
		 * Luego recorre con estos el vector circulos y rectangulos para borrarlos, efectuando deletes. Por último pone a valores de 0 el alto, el ancho, y la cadena titulo la asigna a vacio.
		 *
		 * \return No devuelve nada.
		 */
		~Lienzo();

		/** \brief Método getAncho().
		 *
		 * Este método nos devuelve el valor del atributo "ancho" del objeto que lo llame.
		 *
		 * \return Devuelve un float, el ancho.
		 */
		float getAncho() const;

		/** \brief Método getAlto().
		 *
		 * Este método nos devuelve el valor del atributo "alto" del objeto que lo llame.
		 *
		 * \return Devuelve un float, el alto.
		 */
		float getAlto() const;

		/** \brief Método getFiguras().
		 *
		 * Este método nos devuelve el la cantidad de figuras del objeto que lo llame.
		 *
		 * \return Devuelve un vector de punteros a IDibujable.
		 */
		vector<IDibujable*> getFiguras() const;

	private:

		/** \brief Variable "titulo", tipo string.
		 *
		 * Esta variable contendrá un string con el nombre del lienzo que le habremos pasado.
		 */
		string titulo;
		/** \brief Variable "ancho" tipo float.
		 *
		 * Contiene el ancho del lienzo en un float.
		 */
		float ancho;

		/** \brief Variable altotipo float.
		 *
		 * Contiene el valor en float del alto del lienzo.
		 */
		float alto;

		/** \brief Variable figuras, vector dinámico de objetos Circulo y/o Rectangulo.
		 *
		 * Esta variable contiene los objetos tipo Circulo y/o Rectangulo que el programa necesite almacenar para trabajar con ellos.
		 */
		vector<IDibujable*> figuras;
};


#endif
